home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tech Arsenal 1
/
Tech Arsenal (Arsenal Computer).ISO
/
tek-01
/
msoftapp.zip
/
FILEWIN.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
1993-06-01
|
10KB
|
436 lines
// filewin.cpp : Defines the class behaviors for the application.
#include"viewer.h"
const SIZESTRING = 256; // max characters in string
// CFileWin message map:
BEGIN_MESSAGE_MAP(CFileWin, CMDIChildWnd)
ON_WM_CREATE()
ON_COMMAND(IDM_BLACK, OnColor)
ON_COMMAND(IDM_RED, OnColor)
ON_COMMAND(IDM_GREEN, OnColor)
ON_COMMAND(IDM_BLUE, OnColor)
ON_COMMAND(IDM_WHITE, OnColor)
ON_COMMAND(IDM_CUSTOM, OnColor)
ON_WM_PAINT()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_TIMER()
ON_WM_MDIACTIVATE()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
CFileWin::CFileWin(void)
{
m_pMenuCurrent = NULL;
m_bWindowActive = FALSE;
m_pMyFile = NULL;
m_ColorID = IDM_BLACK;
m_TextColor = clrTextArray[0];
}
CFileWin::~CFileWin(void)
{
if(m_pMyFile != NULL)
{
m_pMyFile->Close();
delete m_pMyFile;
}
if(m_bWindowActive)
{
// Suppress Foundation DestroyMenu done in CMenu destructor
//(Windows takes care of menu cleanup for the active window)
//
m_pMenuCurrent->Detach();
}
}
int CFileWin::OnCreate(LPCREATESTRUCT)
{
TEXTMETRIC tm;
CWindowDC dc(this);
dc.SelectStockObject(SYSTEM_FIXED_FONT);
dc.GetTextMetrics(&tm);
m_nCxChar = tm.tmAveCharWidth;
m_nCyChar = tm.tmHeight + tm.tmExternalLeading;
m_nVScrollPos = 0;
m_nHScrollPos = 0;
m_lTopLine = 0L;
SetScrollRange(SB_VERT, 0, SCROLLMAX, FALSE);
SetScrollRange(SB_HORZ, 0, SIZESTRING, FALSE);
SetWindowText(strFileTitle);
return 0;
}
void CFileWin::OnDestroy(void)
{
GetMDIFrame()->SendMessage(WM_CHILDDESTROY,(UINT)m_hWnd, 0);
}
// OnPaint
void CFileWin::OnPaint(void)
{
char acBuf[ SIZESTRING ];
CPaintDC dc(this);
CRect rect, rect2;
int y;
char* pc;
GetClientRect(&rect);
dc.SetTextAlign(TA_LEFT);
dc.SelectStockObject(SYSTEM_FIXED_FONT);
dc.SetTextColor(m_TextColor); //::GetSysColor(COLOR_WINDOWTEXT));
dc.SetBkColor(::GetSysColor(COLOR_WINDOW));
if(m_pMyFile != NULL)
{
TRY
{
m_pMyFile->Seek(m_lTopLine, CFile::begin);
}
CATCH(CFileException, e)
{
TRACE("Bad Seek in OnPaint %ld\n", m_lTopLine);
}
END_CATCH
rect2.left = rect.left;
rect2.right = rect.right;
m_nLinesPainted = 0;
for(y = m_nCxChar/2; y < rect.bottom; y += m_nCyChar)
{
m_pMyFile->NextLine(acBuf, SIZESTRING);
pc = acBuf;
if((int)strlen(acBuf) < m_nHScrollPos)
*acBuf = 0;
else
pc += m_nHScrollPos;
rect2.top = y;
rect2.bottom = y + m_nCyChar;
dc.ExtTextOut(m_nCyChar/2, rect2.top, ETO_OPAQUE, &rect2,
pc, strlen(pc), NULL);
m_nLinesPainted++;
}
}
}
// OnAbout:
void CFileWin::OnAbout(void)
{
CDialog about("AboutBox", this);
about.DoModal();
}
// OnOpen:
BOOL CFileWin::Open(void)
{
CString strFileName;
// First close any open file
if(m_pMyFile != NULL)
{
m_pMyFile->Close();
delete m_pMyFile;
m_pMyFile = NULL;
SetWindowText("No File");
Invalidate(TRUE);
m_lTopLine = 0L;
m_nVScrollPos = 0;
SetScrollPos(SB_VERT, m_nVScrollPos, TRUE);
m_nHScrollPos = 0;
SetScrollPos(SB_HORZ, m_nHScrollPos, TRUE);
}
BOOL success;
TRY
{
success = FileDlg(TRUE, SIZESTRING,
strFileName.GetBuffer(SIZESTRING),
SIZESTRING,
strFileTitle.GetBuffer(SIZESTRING));
strFileName.ReleaseBuffer();
strFileTitle.ReleaseBuffer();
if(success)
{
// try to open the file here
m_pMyFile = new CLineFile(strFileName,
CFile::modeRead | CFile::typeBinary);
m_lFileSize = m_pMyFile->GetLength();
// check to make sure it is a text file
BYTE byBuf[128];
for(int iby = m_pMyFile->Read(&byBuf, 128); --iby >= 0;)
if(byBuf[iby] > 128)
{
m_pMyFile->Close();
delete m_pMyFile;
m_pMyFile = NULL;
m_lFileSize = 0L;
MessageBox("File contains non-printable characters",
"Error", MB_OK);
return FALSE;
}
m_pMyFile->SeekToBegin();
}
}
CATCH(CFileException, e)
{
char ErrorMsg[ 80 ];
sprintf(ErrorMsg,"Error 0x%lx opening %s.",
e->m_lOsError, (const char*)strFileTitle);
MessageBox(ErrorMsg, "File Open Error");
}
END_CATCH
return success;
}
// OnVScroll:
void CFileWin::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar*)
{
char acBuf[SIZESTRING];
LONG oldLine = m_lTopLine;
LONG l;
if(m_pMyFile == NULL)
return;
TRY
{
switch(nSBCode)
{
case SB_LINEUP:
if(m_lTopLine == 0L)
break;
m_pMyFile->SetBegin(m_lTopLine);
m_lTopLine = m_pMyFile->BackLines(acBuf, SIZESTRING, 1);
break;
case SB_LINEDOWN:
m_pMyFile->Seek(m_lTopLine, CFile::begin);
m_lTopLine = m_pMyFile->NextLine(acBuf, SIZESTRING);
break;
case SB_PAGEUP:
if(m_lTopLine == 0L)
break;
m_pMyFile->SetBegin(m_lTopLine);
m_lTopLine = m_pMyFile->BackLines(acBuf, SIZESTRING,
m_nLinesPainted);
break;
case SB_PAGEDOWN:
m_lTopLine = m_pMyFile->GetPosition();
break;
case SB_BOTTOM:
nPos = 1000;
goto ThumbGoTo;
case SB_TOP:
nPos = 0;
// fall thru
case SB_THUMBPOSITION:
ThumbGoTo:
m_nVScrollPos = nPos;
if(m_lFileSize > 40000L)
l =(m_lFileSize / 1000L) * nPos;
else
l =(m_lFileSize * nPos) / 1000L;
m_lTopLine = m_pMyFile->LineNear(acBuf, SIZESTRING, l);
break;
default:
return;
}
}
CATCH(CFileException, e)
{
TRACE("Bad Seek in OnVScroll\n");
m_lTopLine = 0L;
}
END_CATCH
if(m_lTopLine < 0L)
m_lTopLine = 0L;
if(m_lFileSize > 40000)
m_nVScrollPos =(short)(m_lTopLine /(m_lFileSize / 1000L));
else
m_nVScrollPos =(short)(m_lTopLine * 1000L / m_lFileSize);
if(m_nVScrollPos < 0)
m_nVScrollPos = 0;
if(m_nVScrollPos > SCROLLMAX)
m_nVScrollPos = SCROLLMAX;
SetScrollPos(SB_VERT, m_nVScrollPos, TRUE);
if(m_lTopLine != oldLine)
Invalidate(FALSE);
}
// OnHScroll:
void CFileWin::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar*)
{
if(m_pMyFile == NULL)
return;
switch(nSBCode)
{
case SB_LINEUP:
m_nHScrollPos -= 1;
break;
case SB_LINEDOWN:
m_nHScrollPos += 1;
break;
case SB_PAGEUP:
m_nHScrollPos -= 10;
break;
case SB_PAGEDOWN:
m_nHScrollPos += 10;
break;
case SB_TOP:
nPos = 0;
// fall thru
case SB_THUMBPOSITION:
m_nHScrollPos = nPos;
break;
default:
return;
}
if(m_nHScrollPos < 0)
m_nHScrollPos = 0;
if(m_nHScrollPos > SIZESTRING)
m_nHScrollPos = SIZESTRING;
SetScrollPos(SB_HORZ, m_nHScrollPos, TRUE);
Invalidate(FALSE);
}
// catch arrow keys and simulate touching scroll bars
void CFileWin::OnKeyDown(UINT wChar, UINT /* nRepCnt */, UINT /* wFlags */)
{
switch(wChar)
{
case VK_HOME:
SendMessage(WM_VSCROLL, SB_TOP, 0L);
SendMessage(WM_HSCROLL, SB_TOP, 0L);
return;
case VK_END:
SendMessage(WM_VSCROLL, SB_BOTTOM, 0L);
return;
case VK_PRIOR:
SendMessage(WM_VSCROLL, SB_PAGEUP, 0L);
return;
case VK_NEXT:
SendMessage(WM_VSCROLL, SB_PAGEDOWN, 0L);
return;
case VK_UP:
SendMessage(WM_VSCROLL, SB_LINEUP, 0L);
return;
case VK_DOWN:
SendMessage(WM_VSCROLL, SB_LINEDOWN, 0L);
return;
case VK_RIGHT:
SendMessage(WM_HSCROLL, SB_LINEDOWN, 0L);
return;
case VK_LEFT:
SendMessage(WM_HSCROLL, SB_LINEUP, 0L);
return;
}
}
BOOL CFileWin::FileDlg(BOOL bOpen, int nMaxFile, LPSTR szFile,
int nMaxFileTitle, LPSTR szFileTitle)
{
char szFilter[] = "Text Files(*.txt)|*.txt|All Files(*.*)|*.*||";
CFileDialog dlg(bOpen, "txt", szFile, OFN_HIDEREADONLY, szFilter);
// This example shows how to access the OPENFILENAME struct
// directly.
dlg.m_ofn.lpstrFile = szFile;
dlg.m_ofn.lpstrFileTitle = szFileTitle;
dlg.m_ofn.nMaxFileTitle = nMaxFileTitle;
return dlg.DoModal() == IDOK ? TRUE : FALSE;
}
void CFileWin::OnMDIActivate(BOOL bActivate, CWnd*, CWnd*)
{
CMDIFrameWnd* pFrame = GetMDIFrame();
CMenu* pWinPopupMenu = NULL;
CMenu* pMenu = new CMenu;
m_bWindowActive = bActivate;
if(bActivate)
{
pMenu->LoadMenu("FileWin");
pWinPopupMenu = pMenu->GetSubMenu(FILEWIN_MENU_POS);
CMenu* pLastMenu = pFrame->MDISetMenu(pMenu, pWinPopupMenu);
pLastMenu->DestroyMenu();
pMenu->CheckMenuItem(m_ColorID, bActivate ? MF_CHECKED : MF_UNCHECKED);
}
else
{
pMenu->LoadMenu("Init");
pWinPopupMenu = pMenu->GetSubMenu(INIT_MENU_POS);
CMenu* pLastMenu = pFrame->MDISetMenu(pMenu, pWinPopupMenu);
pLastMenu->DestroyMenu();
}
delete m_pMenuCurrent;
m_pMenuCurrent = pMenu;
pFrame->DrawMenuBar();
}
// OnColor: Change menu checkmarks to indicate the newly selected color.
void CFileWin::OnColor()
{
CMenu* pMenu = GetMDIFrame()->GetMenu();
pMenu->CheckMenuItem(m_ColorID, MF_UNCHECKED);
m_ColorID = GetCurrentMessage()->wParam;
pMenu->CheckMenuItem(m_ColorID, MF_CHECKED);
if(m_ColorID != IDM_CUSTOM)
m_TextColor = clrTextArray[m_ColorID - IDM_BLACK];
else
{
CColorDialog dlgColor(m_TextColor);
if(dlgColor.DoModal() == IDOK)
m_TextColor = dlgColor.GetColor();
}
// Force the client area text to be repainted in the new color
Invalidate();
}